package com.xiaol.springbootredis.common.wrapper;


import com.xiaol.springbootredis.common.enums.StatusCode;
import org.apache.commons.lang3.StringUtils;

/**
 * User: chenshun131 <p />
 * Time: 18/6/18 12:19  <p />
 * Version: V1.0  <p />
 * Description: The class Wrap mapper <p />
 */
public class WrapMapper {

    /**
     * Instantiates a new wrap mapper
     */
    private WrapMapper() {
    }

    /**
     * Wrap
     *
     * @param <E>
     *         the element type
     * @param code
     *         the code
     * @param message
     *         the message
     * @param o
     *         the o
     * @return the wrapper
     */
    public static <E> Wrapper<E> wrap(int code, String message, E o) {
        return new Wrapper<>(code, message, o);
    }

    /**
     * Wrap
     *
     * @param <E>
     *         the element type
     * @param code
     *         the code
     * @param message
     *         the message
     * @return the wrapper
     */
    public static <E> Wrapper<E> wrap(int code, String message) {
        return wrap(code, message, null);
    }

    /**
     * Wrap
     *
     * @param <E>
     *         the element type
     * @param code
     *         the code
     * @return the wrapper
     */
    public static <E> Wrapper<E> wrap(int code) {
        return wrap(code, null);
    }

    /**
     * Wrap
     *
     * @param <E>
     *         the element type
     * @param e
     *         the e
     * @return the wrapper
     */
    public static <E> Wrapper<E> wrap(Exception e) {
        return new Wrapper<>(Wrapper.ERROR_CODE, e.getMessage());
    }

    /**
     * 通过状态码获取信息
     *
     * @param statusCode
     * @param <E>
     * @return
     */
    public static <E> Wrapper<E> wrap(StatusCode statusCode) {
        if (statusCode == null) {
            return null;
        }
        return new Wrapper<>(statusCode.code(), statusCode.msg());
    }

    /**
     * Un wrapper
     *
     * @param <E>
     *         the element type
     * @param wrapper
     *         the wrapper
     * @return the e
     */
    public static <E> E unWrap(Wrapper<E> wrapper) {
        return wrapper.getResult();
    }

    /**
     * Wrap ERROR. code=100
     *
     * @param <E>
     *         the element type
     * @return the wrapper
     */
    public static <E> Wrapper<E> illegalArgument() {
        return wrap(Wrapper.ILLEGAL_ARGUMENT_CODE_, Wrapper.ILLEGAL_ARGUMENT_MESSAGE);
    }

    /**
     * Wrap ERROR. code=500
     *
     * @param <E>
     *         the element type
     * @return the wrapper
     */
    public static <E> Wrapper<E> error() {
        return wrap(Wrapper.ERROR_CODE, Wrapper.ERROR_MESSAGE);
    }


    /**
     * Error wrapper
     *
     * @param <E>
     *         the type parameter
     * @param message
     *         the message
     * @return the wrapper
     */
    public static <E> Wrapper<E> error(String message) {
        return wrap(Wrapper.ERROR_CODE, StringUtils.isBlank(message) ? Wrapper.ERROR_MESSAGE : message);
    }

    /**
     * Wrap SUCCESS. code=200
     *
     * @param <E>
     *         the element type
     * @return the wrapper
     */
    public static <E> Wrapper<E> ok() {
        return new Wrapper<>();
    }

    /**
     * Ok wrapper
     *
     * @param <E>
     *         the type parameter
     * @param o
     *         the o
     * @return the wrapper
     */
    public static <E> Wrapper<E> ok(E o) {
        return new Wrapper<>(Wrapper.SUCCESS_CODE, Wrapper.SUCCESS_MESSAGE, o);
    }

}
